{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "bdd419a3",
   "metadata": {},
   "source": [
    "# Python机器学习Kaggle案例实战（第21期） 第8课书面作业\n",
    "学号：113778  \n",
    "\n",
    "**作业内容：**\n",
    "1. 学习了三周的点击率预测，你还有其他什么关于点击率预测的方法跟大家一起分享吗？ \n",
    "2. 归纳总结在点击率预测中常用的特征构造方法 "
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "40bd5e3e",
   "metadata": {},
   "source": [
    "## 作业1\n",
    "学习了三周的点击率预测，你还有其他什么关于点击率预测的方法跟大家一起分享吗？  \n",
    "\n",
    "**我想讲一讲DeepFM模型：**\n",
    "对于一个基于CTR预估的推荐系统，最重要的是学习到用户点击行为背后隐含的特征组合。在不同的推荐场景中，低阶组合特征或者高阶组合特征可能都会对最终的CTR产生影响。但是现存的方法总是忽视了高阶或低阶组合特征的联系，或者要求专门的特征工程，DeepFM模型将FM与DNN结合起来。  \n",
    "\n",
    "![下载1](https://gitee.com/dotzhen/cloud-notes/raw/master/%E4%B8%8B%E8%BD%BD1.png)\n",
    "\n",
    "如上图所示整体结构为FM Component + Deep Component。  \n",
    "FM提取低阶组合特征，Deep提取高阶组合特征。但是和Wide&Deep不同的是，DeepFM是端到端的训练，不需要人工特征工程。  \n",
    "另外FM和Deep部分共享feature embedding。FM和Deep共享输入和feature embedding不但使得训练更快，而且使得训练更加准确。相比之下，Wide&Deep中，input vector非常大，里面包含了大量的人工设计的pairwise组合特征，增加了他的计算复杂度。  \n",
    "\n",
    "**1、FM部分**  \n",
    "![下载2](https://gitee.com/dotzhen/cloud-notes/raw/master/%E4%B8%8B%E8%BD%BD2.png)\n",
    "FM部分的输出由两部分组成：一个Addition Unit，多个内积单元。\n",
    "\n",
    "Addition Unit 反映的是1阶的特征。内积单元反映的是2阶的组合特征对于预测结果的影响。\n",
    "\n",
    "FM部分的特点：  \n",
    "FM模块实现了对于1阶和2阶组合特征的建模；  \n",
    "没有使用预训练；  \n",
    "没有人工特征工程；  \n",
    "embedding矩阵的大小是：特征数量 * 嵌入维度。 然后用一个index表示选择了哪个特征。\n",
    "\n",
    "FM需要训练的两部分：\n",
    "input_vector和Addition Unit相连的全连接层，也就是1阶的Embedding矩阵。  \n",
    "Sparse Feature到Dense Embedding的Embedding矩阵，中间也是全连接的，要训练的是中间的权重矩阵，这个权重矩阵也就是隐向量V。\n",
    "\n",
    "**2、Deep部分**  \n",
    "![下载3](https://gitee.com/dotzhen/cloud-notes/raw/master/%E4%B8%8B%E8%BD%BD3.png)\n",
    "Deep Component是用来学习高阶组合特征的。网络里面黑色的线是全连接层，参数需要神经网络去学习。\n",
    "\n",
    "由于CTR或推荐系统的数据one-hot之后特别稀疏，如果直接放入到DNN中，参数非常多，我们没有这么多的数据去训练这样一个网络。所以增加了一个Embedding层，用于降低纬度。\n",
    "\n",
    "Embedding层，两个特点：  \n",
    "尽管输入的长度不同，但是映射后长度都是相同的.embedding_size(k)  \n",
    "embedding层的参数其实是全连接的Weights，是通过神经网络自己学习到的。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e84932c8",
   "metadata": {},
   "source": [
    "## 作业2\n",
    "\n",
    "归纳总结在点击率预测中常用的特征构造方法。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "53a5d7ce",
   "metadata": {},
   "source": [
    "在推荐系统中，点击率（CTR）的预测非常重要，其任务是估计用户点击推荐项目的概率。在许多推荐系统中，目标就是最大化点击次数。而学习数据内在的隐性特征对提升CTR预测能力具有重要意义。而挖掘特征间交互特征一种重要方法。  \n",
    "通过有些研究发现，主流应用程序市场上，人们经常在用餐时间下载外卖相关app，这表明app类别和时间戳之间的交互特征可用作为CTR预测的潜在特征。另外，\n",
    "男性青少年喜欢射击游戏和RPG游戏，这意味着app类别、用户性别和年龄的也可作为交互特征成为CTR预测的另一个潜在特征。一般来说，用户点击行为背后的这些特性的交互可能非常复杂。低阶和高阶特征交互都可能扮演着重要角色。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3d721c69",
   "metadata": {},
   "source": [
    "这里低阶交互特性主要是指2阶的交互特性，高阶是指大于2阶的交互特性。据相关论文描述：与单独考虑低阶和高阶特征交互的情况相比，同时考虑低阶和高阶特征交互带来了额外的改进。**而关键挑战在于如何效地提取这些交互特征。**  \n",
    "* 有些交互特征很容易理解，可以**由人工实现提取**（如前面提到的app类别与时间戳的交互等）。但是，大多数其他交互特征都隐藏在数据中而且难以识别，需要从数据中挖掘出来，只有通过机器学习才能自动捕获。有些即使很容易理解，但是凭借人工似乎也不太可能对它们进行详尽的建模，尤其是在特征数量很大的情况下。在广义线性模型，如LR或者FTRL模型在实践中表现出良好的性能。然而，线性模型缺乏学习交互特征交互的能力，通常的做法是在其特征向量中手动包含成对特征交互。这种方法很难推广到模型高阶特征交互或从未或很少出现的交互在训练数据中。\n",
    "* 相比人工方式增加交互特性，还可以采用用GBDT模型对训练数据进行预处理，由GBDT模型对数据进行特征重要性选择并进行特性组合。这种方法由Facebook提出，非常的巧妙，**利用GBDT自动进行特征筛选和组合**，进而生成新的离散特征向量，再把该特征向量当作LR模型输入，预估CTR的模型结构。这个过程在我看来有点像下面要讲的FM方法，将稀疏特性向量映射到了dense real vector。LR+GBDT相比于单纯的LR或者GBDT带来了较大的性能提升，相关论文中给出数据为3%。由于决策树的结构特点，事实上，决策树的深度就决定了特征交叉的维度。如果决策树的深度为4，通过三次节点分裂，最终的叶节点实际上是进行了3阶特征组合后的结果，如此强的特征组合能力显然是FM系的模型不具备的。但由于GBDT容易产生过拟合，以及GBDT这种特征转换方式实际上丢失了大量特征的数值信息，因此我们不能简单说GBDT由于特征交叉的能力更强，效果就比FM或FFM好。在模型的选择和调试上，永远都是多种因素综合作用的结果。\n",
    "* 采用FM模型又是另一种**自动构建特征交互的方法**，它可以自动且高效地构建特征与特征之间隐性向量的内积交互关系。原则上FM可以建模出更高阶特征交互，但是在实践中通常只到2阶，主要由于高度复杂性以及效率问题。FFM是FM的升级版模型，通过引入field的概念，FFM把相同性质的特征归于同一个field，隐向量不仅与特征相关，也与field相关。\n",
    "* **采用深度神经网络来自动学习高阶特征交互**。深度神经网络具有学习复杂特征交互的能力。比如用CNN/RNN来进行CTR预测，但基于CNN的模型偏向于相邻特征之间的交互，而基于RNN的模型更适合于具有序列依赖关系的点击数据。还有研究人员提出了FM支持的神经网络（FNN），在这种模型下，在应用前用FM进行了预训练再传入DNN网络，因此其本身特征交互的表示能力受到FM模型的限制。还有模型通过在嵌入层和完全连接层之间引入Product layer，提出了基于乘积的神经网络（PNN）。PNN和FNN，以及其他深度模型，捕捉很少的低阶特征交互，而这些对于CTR预测也很重要。\n",
    "* **自动提取低阶和高阶特征交互**。为了兼顾低阶和高阶特征交互进行建模，有人也提出了一种新的神经网络模型DeepFM（如作业1描述）。集成了FM和\n",
    "深度神经网络（DNN）。它对低阶特征交互（如FM）进行建模，对高阶特征交互（如DNN）进行建模。可以对DeepFM进行端到端的训练，而无需任何特征工程。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
